package com.example.base_model.network

import android.content.Context
import com.example.base_model.api.ApiService
import com.example.base_model.network.download.DownloadManager
import com.example.base_model.network.interceptor.CacheInterceptor
import com.example.base_model.network.interceptor.HttpLoggingInterceptor
import com.example.base_model.network.interceptor.StatusInterceptor
import com.example.base_model.socket.ModernMqttManager
import com.squareup.moshi.Moshi
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.qualifiers.ApplicationContext
import dagger.hilt.components.SingletonComponent
import okhttp3.OkHttpClient
import retrofit2.Retrofit
import retrofit2.converter.moshi.MoshiConverterFactory
import java.util.concurrent.TimeUnit
import javax.inject.Singleton

/**
 * @Author: jiangKunKun
 * @CreateDate: 2025/7/02
 * @Description: Dagger Hilt 网络模块，用于提供网络请求相关的依赖对象。
 * @SpittingGrooves
 */
@Module
@InstallIn(SingletonComponent::class)
object NetworkModule {

    /**
     * 提供 [Moshi] 单例对象，用于 JSON 解析。
     *
     * @return [Moshi] 实例。
     */
    @Provides
    @Singleton
    fun provideMoshi(): Moshi {
        return Moshi.Builder()
            .build()
    }

    /**
     * 提供 [OkHttpClient] 单例对象，用于执行 HTTP 请求。
     *
     * @param context Application 上下文。
     * @return 配置好的 [OkHttpClient] 实例。
     */
    @Provides
    @Singleton
    fun provideOkHttpClient(
        @ApplicationContext context: Context
    ): OkHttpClient {
        return OkHttpClient
            .Builder()
            // 设置连接、读取和写入的超时时间
            .connectTimeout(8, TimeUnit.SECONDS)
            .readTimeout(8, TimeUnit.SECONDS)
            .writeTimeout(8, TimeUnit.SECONDS)
            // 配置 HTTP 缓存
            .cache(CacheInterceptor.createHttpCache(context))
            // 添加缓存拦截器
            .addInterceptor(CacheInterceptor())
            // 添加状态拦截器，用于处理特定的响应状态
            .addInterceptor(StatusInterceptor())
            // 添加日志拦截器，用于打印网络请求和响应的日志
            .addInterceptor(HttpLoggingInterceptor(moshi = provideMoshi()))
            .build()
    }


    /**
     * 提供 [Retrofit] 单例对象，用于构建 API 服务。
     *
     * @param okHttpClient [OkHttpClient] 实例。
     * @param moshi [Moshi] 实例。
     * @return 配置好的 [Retrofit] 实例。
     */
    @Provides
    @Singleton
    fun provideRetrofit(
        okHttpClient: OkHttpClient,
        moshi: Moshi
    ): Retrofit {
        return Retrofit.Builder()
            .baseUrl(ApiService.SERVER_URL) // 设置基础 URL
            .client(okHttpClient) // 设置自定义的 OkHttpClient
            .addConverterFactory(MoshiConverterFactory.create(moshi)) // 添加 Moshi 作为 JSON 转换器
            .build()
    }

    /**
     * 提供 [ApiService] 单例对象，用于定义具体的网络请求接口。
     *
     * @param retrofit [Retrofit] 实例。
     * @return [ApiService] 的实现。
     */
    @Provides
    @Singleton
    fun provideApiService(retrofit: Retrofit): ApiService {
        return retrofit.create(ApiService::class.java)
    }

    /**
     * 提供MQTT管理器实例
     * 创建并配置ModernMqttManager对象
     *
     * @param context Android应用上下文
     * @param moshi JSON序列化工具
     * @return 配置好的ModernMqttManager实例
     */
    @Provides
    @Singleton
    fun provideMqttManager(
        @ApplicationContext context: Context,
        moshi: Moshi
    ): ModernMqttManager {
        return ModernMqttManager(context, moshi)
    }

    /**
     * 提供 [DownloadManager] 单例对象，用于处理文件下载。
     *
     * @param okHttpClient [OkHttpClient] 实例。
     * @param retrofit [Retrofit] 实例。
     * @param context Application 上下文。
     * @return [DownloadManager] 实例。
     */
    @Provides
    @Singleton
    fun provideDownloadManager(
        okHttpClient: OkHttpClient,
        retrofit: Retrofit,
        @ApplicationContext context: Context
    ): DownloadManager {
        return DownloadManager(okHttpClient, retrofit, context)
    }
} 
